<?php

/**
*Clase que manipula las facturas
*
*Esta clase informa acerca de lo que debe pagar un cliente para posteriormente imprimirlo en una factura.
*
*@author gush
*@author pegudo
*@package controller
*/
Class FacturasController extends AppController 
{
	var $name = 'Facturas';
	var $uses = array();
	var $helpers = array('pdf','Ajax'); // this will use the pdf.php class 
	var $components = array('ModelLoader');

	/**
	*/
	function index()
	{
		$this->setearSubMenu();
	}

	/**
	 * Precede la vista de listar clientes cerrar mes. ABM de cerrar mes.
	 * @return 
	 */
	function listarClientesCerrarMes(){
		
		//seteo el submenu
		$this->setearSubMenu();
		
		//setea los clientes
		$aClientes = $this->requestAction('/clientes/seleccionarClientes');
		$this->set('aClientes',$aClientes);
		
	}

	function listarClientesFacturar()
	{
		//seteo el submenu
		$this->setearSubMenu();
		//setea los clientes
		$clientes = $this->requestAction('/clientes/seleccionarClientes');
		$this->set('clientes',$clientes);
	}
	
	function imprimir() {
		$this->set('test',$this->data);
	}

	/**
	 * Procesa los clientes que pueden ser facturados y los que no.
	 * @return 
	 */
	function procesarClientesParaMesActual(){
		//obtiene los ids de los clientes a facturar
		$sIds = $this->data['Factura']['ids'];
		$aLista = explode(',',$sIds);

		//creo dos listas, los clientes que pueden ser facturados y los que no.
		$aPermitidos = array();
		$aNoPermitidos = array();
		$sFechaActual = date("Y-m-d");
		$sFechaActual = $this->ultimoDia($sFechaActual);
		$this->ModelLoader->setController($this);
		$this->ModelLoader->load('Cliente');
		$sIdsPermitidos = '';
		foreach($aLista as $iIdCliente)
		{
			//controla si es posible facturar, si tiene todos los meses cerrados.
			$facturar = $this->requestAction("historialprecios/mesCerrado/$iIdCliente/$sFechaActual/");
			
			$conditions = array('id'=>$iIdCliente);
			$fields = array('id','nombre');
			$this->Cliente->unBindModel(array('hasMany'=>array('Clientepersona','Prestacion','Contrato')));
			$aCliente = $this->Cliente->find($conditions,$fields);
			if($facturar)
			{
				$sIdsPermitidos .= ',' . strval($aCliente['Cliente']['id']);
				$aPermitidos[] = $aCliente;
			}
			else
			{
				$aNoPermitidos[] = $aCliente;
			}
		}

		$sIdsPermitidos = substr($sIdsPermitidos, 1);
		$this->set('sIdsPermitidos',$sIdsPermitidos);
		$this->set('aPermitidos',$aPermitidos);
		$this->set('aNoPermitidos',$aNoPermitidos);
		$this->set('dMesFacturar',$this->printDate($sFechaActual));
		$this->render('estado_mes_actual','ajax');

	}
	
/**
	 * Procesa los clientes que pueden ser facturados y los que no.
	 * @return 
	 */
	function procesarClientesParaMesAnterior(){
		
		//obtiene los ids de los clientes a facturar
		$sIds = $this->data['Factura']['ids'];
		$aLista = explode(',',$sIds);

		//creo una lista con los clientes
		$aPermitidos = array();
		$sFechaActual = date("Y-m-d");
		$sFechaActual = $this->ultimoDia($sFechaActual);
		$this->ModelLoader->setController($this);
		$this->ModelLoader->load('Cliente');
		$iCont = 0;
		foreach($aLista as $iIdCliente){
			
			$conditions = array('id'=>$iIdCliente);
			$fields = array('id','nombre');
			$this->Cliente->unBindModel(array('hasMany'=>array('Clientepersona','Prestacion','Contrato')));
			$aCliente = $this->Cliente->find($conditions,$fields);

			$aPermitidos[$iCont] = $aCliente;
			
			//desde el inicio del contrato hasta la fecha actual
			$dFecha = $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente/");
			$dFecha = $this->ultimoDia($dFecha);
			$dFechaLimite = $this->ultimoDia($this->agregarMes($sFechaActual));
			
			//creo un arreglo con los meses acentando si estan cerrados o no
			$i = 0;
			$aMeses = array();
			while($dFecha!=$dFechaLimite){
				
				$aMeses[$i]['mesToPrint'] = $this->printDate($dFecha);
				$aMeses[$i]['mes'] = $dFecha;
				$bFacturar = $this->requestAction("historialprecios/mesCerrado/$iIdCliente/$dFecha/");
				if($bFacturar){
					$aMeses[$i]['cerrado'] = 'true';
				}
				else{
					$aMeses[$i]['cerrado'] = 'false';
				}
				
				//aumento la fecha en un mes
				$dFecha = $this->ultimoDia($this->agregarMes($dFecha));
				$i++;
			}
			
			$aPermitidos[$iCont]['Meses'] = $aMeses;
			$iCont++;

		}

		$this->set('aClientes',$aPermitidos);
		$this->render('estado_mes_anterior','ajax');

	}

	function facturarMesActual(){

		//reemplazar con variables del sistema
		$iIdCustodia = 2;
		$iIdExpurgue = 3;

		$this->setearSubMenu();

		//fecha actual
		$dFechaActual = date("Y-m-d");
		$dFechaActual = $this->ultimoDia($dFechaActual);
		
		//enviamos la fecha actual
		$aFechaAux = explode("-",$dFechaActual);
		
		$aFechaActual = array();
		
		$aFechaActual["dia"]=$aFechaAux[2];
		$aFechaActual["mes"]=$aFechaAux[1];
		$aFechaActual["anio"]=substr($aFechaAux[0], -2, 2);
		$this->set('aFechaActual',$aFechaActual);
			
		//obtiene los ids de los clientes a facturar
		$sIds = $this->data['Factura']['ids_permitidos'];
		$aLista = explode(',',$sIds);
		$sIdCliente_dFecha = '';
		foreach($aLista as $iIdCliente){
			$sIdCliente_dFecha .= $iIdCliente.'_'.$dFechaActual.',';
		}
		$sIdCliente_dFecha = substr($sIdCliente_dFecha,0,-1);

		//llama a la funcion facturar meses
		$aClientes = $this->facturarMes($sIdCliente_dFecha);
		
		foreach($aClientes as $idCliente => $aCliente)
		{
			if($aCliente['Cliente']['condicion_iva']=='inscripto')
			{
				$aClientes[$idCliente]['tipoFactura'] = 'A';	
			}else
			{
				$aClientes[$idCliente]['tipoFactura'] = 'B';
			}
		}
		
		$this->set('aClientes',$aClientes);
			
		//$this->render('facturar_mes_actual','ajax');
		$this->layout = 'pdf';
		$this->render('facturar');
	}
	
	function facturarMesAnterior(){

		//reemplazar con variables del sistema
		$iIdCustodia = 2;
		$iIdExpurgue = 3;

		$this->setearSubMenu();
	
		//obtiene los ids de los clientes a facturar
		$sIds = $this->data['Factura']['ids_mes_anterior'];
		
		//llama a facturar los meses seleccionados
		$aClientes = $this->facturarMes($sIds);
		
		foreach($aClientes as $idCliente => $aCliente)
		{
			if($aCliente['Cliente']['condicion_iva']=='inscripto')
			{
				$aClientes[$idCliente]['tipoFactura'] = 'A';	
			}else
			{
				$aClientes[$idCliente]['tipoFactura'] = 'B';
			}
		}
		
		$this->set('aClientes',$aClientes);
		
		//$this->render('facturar_mes_anterior','ajax');
		
		//enviamos la fecha actual
		$sFechaActual = date("d-m-y");			
		$aFechaAux = explode("-",$sFechaActual);
		
		$aFechaActual = array();
		
		$aFechaActual["dia"]=$aFechaAux[0];
		$aFechaActual["mes"]=$aFechaAux[1];
		$aFechaActual["anio"]=$aFechaAux[2];
		$this->set('aFechaActual',$aFechaActual);

		
		$this->layout = 'pdf';
		$this->render('facturar');
	}
	
	/**
	 * 
	 * @return arreglo con los parametros para pasar a la vista factura
	 * @param $sIdCliente_dFecha variable con el id del cliente y la fecha a facturar concatenadas mediante un guion bajo y separando por comas cuando es mas de un mes.
	 * Ejemplo 27_2008-07-31,20_2008-08-31.
	 * esto retorna la factura del cliente 27 en el mes 2008-07-31 y el cliente 20 en el mes 2008-08-31
	 */
	function facturarMes($sIdCliente_dFecha){

		//reemplazar con variables del sistema
		$iIdCustodia = 2;
		$iIdExpurgue = 3;

		$IVA = 0.21;

		$this->setearSubMenu();
	
		//obtiene los ids de los clientes a facturar
		$sIds = $sIdCliente_dFecha;
		$aLista = explode(',',$sIds);
		
		$aClientes = array();

		if(strlen($sIds)>0){
		
			//para cada cliente, sus datos y lo que se facturara
			$this->ModelLoader->setController($this);
			$this->ModelLoader->load('Cliente');
			
			$fields = array('id','nombre');
			$fPrecioCustodia = 0;
			
			$i = 0;
			foreach($aLista as $value){
				$aTmp = explode('_',$value);
				$iIdCliente = $aTmp[0];
				$dFecha = $aTmp[1];
				
				//obtento datos del cliente
				$conditions = array('id'=>$iIdCliente);
				$this->Cliente->unBindModel(array('hasMany'=>array('Clientepersona','Prestacion','Contrato')));
				$aCliente = $this->Cliente->find($conditions);
				
				$aClientes[$i] = $aCliente;
				
				//precio mensual
				$fPrecioCustodia = $this->requestAction("prestacions/getPrecioCustodia/$dFecha/$iIdCliente/");
				
				//monto adeudado mes actual
				$aTmp = explode('-',$dFecha);
				$dFechaInicioMes = date('Y-m-d',mktime(0,0,0,$aTmp[1],1,$aTmp[0]));

				$this->ModelLoader->setController($this);
				$this->ModelLoader->load('Prestacion');
				$conditions = array("cantidad <> 0 AND clientes_id = $iIdCliente AND fecha_inicio >= '$dFechaInicioMes' AND fecha_fin <= '$dFecha' order by fecha_inicio");
				$aPrestaciones = $this->Prestacion->findAll($conditions);
				
				//se procesan las prestaciones para mostrarse como detalles
				$fMontoFacturar = 0;
				$iCantDiasMensual = $aTmp[2];
				$aDetalle = array();
				
				//se suma el iva para las facturas B
				$fImpuesto = 1;
				if($aCliente['Cliente']['condicion_iva'] != 'inscripto'){
					$fImpuesto = 1 + $IVA;
				}
				
				foreach($aPrestaciones as $iKey => $Prestacion){
					
					//arma el detalle
					$aDetalle[$iKey]['iCant'] = $Prestacion['Prestacion']['cantidad'];
					
					$iIdServicio = $Prestacion['Prestacion']['servicios_id'];
					if($iIdServicio == $iIdCustodia){
						//CUSTODIA
						$iDias = $this->diferenciaDias($Prestacion['Prestacion']['fecha_fin'],$Prestacion['Prestacion']['fecha_inicio']) + 1;
						$aDetalle[$iKey]['sDetalle'] = "Custodia de cajas por $iDias dias";
						$aDetalle[$iKey]['fPrecioUnitario'] = $this->redondear($fImpuesto * $fPrecioCustodia/$iCantDiasMensual*$iDias,2);
						$aDetalle[$iKey]['fTotal'] = $aDetalle[$iKey]['fPrecioUnitario'] * $aDetalle[$iKey]['iCant'];
					}
					elseif($iIdServicio == $iIdExpurgue){
						//EXPURGUE
						$iDias = $this->diferenciaDias($Prestacion['Prestacion']['fecha_fin'],$Prestacion['Prestacion']['fecha_inicio']) + 1;
						$aDetalle[$iKey]['sDetalle'] = "Descuento por Expurgue de Cajas(".$Prestacion['Prestacion']['fecha_inicio'].")";
						$aDetalle[$iKey]['fPrecioUnitario'] = $this->redondear($fImpuesto * $fPrecioCustodia/$iCantDiasMensual*$iDias,2);
						$aDetalle[$iKey]['fTotal'] = - $aDetalle[$iKey]['fPrecioUnitario'] * $aDetalle[$iKey]['iCant'];						
					}
					else{
						//OTRA COSA
						$aDetalle[$iKey]['sDetalle'] = $Prestacion['Servicio']['nombre'];
						$aDetalle[$iKey]['fPrecioUnitario'] = $this->redondear($fImpuesto * $Prestacion['Prestacion']['precio']);
						$aDetalle[$iKey]['fTotal'] = $aDetalle[$iKey]['fPrecioUnitario'] * $aDetalle[$iKey]['iCant'];												
					}
					
					//sumo el monto a facturar
					$fMontoFacturar += $aDetalle[$iKey]['fTotal'];
				}

				//obtengo los ingreso de dinero en el mes actual
				$this->ModelLoader->setController($this);
				$this->ModelLoader->load('Cuenta');
				$sConditions = array("clientes_id = $iIdCliente AND fecha >= '$dFechaInicioMes' AND fecha <= '$dFecha'");
				$this->Cuenta->unBindModel(array('belongsTo'=>array('Cliente','Servicio','Formapago')));
				$aCuentas = $this->Cuenta->findAll($sConditions);
				$fMonto = 0;
				foreach($aCuentas as $aCuenta){
					$fMonto += $aCuenta['Cuenta']['monto'];
				}

				//monto adeudado del mes anterior
				$dFechaAnterior = $this->agregarMes($dFecha,-1); 
				$aClienteEstado = $this->requestAction("cuentas/getDeudaCliente/$iIdCliente/$dFechaAnterior/$fPrecioCustodia/");
				$fSaldoMesAnterior = $aClienteEstado['debe'] - $aClienteEstado['pago'];
				$fSaldoMesAnterior -= $fMonto;
				if(isset($iKey))
					$iKey ++;
				else
					$iKey = 0;
				if($fSaldoMesAnterior!=0){
					//$aDetalle[$iKey]['iCant'] = 1;
					//$aDetalle[$iKey]['fPrecioUnitario'] = $fSaldoMesAnterior;
					//$aDetalle[$iKey]['fTotal'] = $fSaldoMesAnterior;
					if($fSaldoMesAnterior > 0){
						$aDetalle[$iKey]['sDetalle'] = "OBSERVACION: Monto Adeudado $".$fSaldoMesAnterior;
					}
					else{
						$aDetalle[$iKey]['sDetalle'] = "OBSERVACION: Monto Acreditado $".$fSaldoMesAnterior;
					}
					
					//sumo el monto a facturar
					//$fMontoFacturar += $aDetalle[$iKey]['fTotal'];
				}

				//seteo el detalle si es que existe alguno
				if(isset($aDetalle)){
					$aClientes[$i]['Detalles'] = $aDetalle;
				}
				//mes facturado
				$aClientes[$i]['mesToPrint'] = $this->printDate($dFecha);
				$aClientes[$i]['TotalFactura'] = $fMontoFacturar;
				$i++;
			}
		}
		//pr($aClientes);
		//exit;
		return $aClientes;
	}
	
	/**
	 * Procesa los clientes y informa los meses cerrados y no cerrados.
	 * @return 
	 */
	function procesarCerrarMes(){
		
		
		$iIdCliente = $this->data['Cliente']['id'];

		//obtiene los datos del cliente
		$this->ModelLoader->setController($this);
		$this->ModelLoader->load('Cliente');
		$conditions = array('id'=>$iIdCliente);
		$fields = array('id','nombre');
		$this->Cliente->unBindModel(array('hasMany'=>array('Clientepersona','Prestacion','Contrato')));
		$aCliente = $this->Cliente->find($conditions,$fields);

		//se fija que meses tiene cerrado y cuales no
		$sFechaFinContrato = $this->requestAction("clientes/getFechaFinContrato/$iIdCliente/");
		$sFechaActual = date('Y-m-d');
		if($sFechaActual > $sFechaFinContrato){
			$sFechaActual = $sFechaFinContrato;
		}
		$sFechaActual = $this->ultimoDia($sFechaActual);
		
		//desde el inicio del contrato hasta la fecha actual
		$dFecha = $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente/");
		$dFecha = $this->ultimoDia($dFecha);
		$dFechaLimite = $this->ultimoDia($this->agregarMes($sFechaActual));
		
		//creo un arreglo con los meses acentando si estan cerrados o no
		$i = 0;
		$aMesesCerrados = array();
		$aMesesAbiertos = array();
		while($dFecha!=$dFechaLimite or $i == 1){
			
			$aMes['mesToPrint'] = $this->printDate($dFecha);
			$aMes['mes'] = $dFecha;
			$bFacturar = $this->requestAction("historialprecios/mesCerrado/$iIdCliente/$dFecha/");
			
			if($bFacturar){
				$aMesesCerrados[$i] = $aMes;
			}
			else{
				$aMesesAbiertos[$i] = $aMes;
			}
		
			//aumento la fecha en un mes
			$dFecha = $this->ultimoDia($this->agregarMes($dFecha));
			$i++;

		}
		
		$aCliente['mesesCerrados'] = $aMesesCerrados;
		$aCliente['mesesAbiertos'] = $aMesesAbiertos;
		
		$this->set('aCliente',$aCliente);		
		$this->render('lista_estado_meses_cerrados','ajax');
		
	}
	
	function showInfoMesCerrado($iIdCliente,$dMes){
		
		//informa la cantidad de cajas custodiadas en ese mes
		$dFechaDesde =  $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente");
		$aCustodias = $this->requestAction("prestacions/getCantCajasCustodiadas/$iIdCliente/$dFechaDesde/$dMes/");
		$iCantCajas = $aCustodias['altas'] - $aCustodias['bajas'];
		
		//el precio con el que se cerro
		$fPrecio = $this->requestAction("historialprecios/getPrecio/$iIdCliente/$dMes/");

		$this->set('iCantCajas',$iCantCajas);
		$this->set('fPrecio',$fPrecio);
		$this->render('show_info_mes_cerrado','ajax');
	}
	
	function showInfoMesNoCerrado($iIdCliente,$dMes){
		
		//informa la cantidad de cajas custodiadas en ese mes
		$dFechaDesde =  $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente");
		$aCustodias = $this->requestAction("prestacions/getCantCajasCustodiadas/$iIdCliente/$dFechaDesde/$dMes/");
		$iCantCajas = $aCustodias['altas'] - $aCustodias['bajas'];		

		//el precio sugerido
		$fPrecioSugerido = $this->requestAction("listaprecios/getPrecio/$iIdCliente/$iCantCajas/");
		
		//controla si el mes puede cerrarse.
		$bCerrado = $this->requestAction("historialprecios/mesCerrado/$iIdCliente/$dMes/");
		$dUltimoMes = $this->requestAction("historialprecios/getUltimoMesCerrado/$iIdCliente/");

		if($dUltimoMes==null){
			$dUltimoMes = $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente/");
			$dUltimoMes = $this->agregarMes($dUltimoMes,-1);
		}

		$dProximoCerrar = $this->ultimoDia($this->agregarMes($dUltimoMes));
		$bPrimeroCerrar = ($dProximoCerrar == $dMes);
		$bCerrable = $bPrimeroCerrar and $bCerrable;
		
		//el value del boton
		if($bCerrable){
			$sValueBoton = 'Cerrar Mes';
		}
		else{
			if($bCerrado){
				$sValueBoton = 'Mes Cerrado';
			}
			else{
				$dProximoCerrar = $this->printDate($dProximoCerrar);
				$sValueBoton = "Debe cerrar $dProximoCerrar";
			}
		}
		
		
		$this->set('sValueBoton',$sValueBoton);
		$this->set('bMesCerrable',$bCerrable);
		$this->set('iCantCajas',$iCantCajas);
		$this->set('fPrecioSugerido',$fPrecioSugerido);
		
		$this->set('iIdCliente',$iIdCliente);
		$this->set('dMes',$dMes);
		$this->render('show_info_mes_no_cerrado','ajax');
	}
	
	function cerrarMes($iIdCliente,$dMes,$iCantCajas){
		
		//cierra el mes
		$fPrecio = $this->data['Factura']['precio'];
		$this->requestAction("historialprecios/cerrarMes/$iIdCliente/$dMes/$fPrecio/$iCantCajas/");
		
		$this->render('cerrar_mes','ajax');
		
	}
	
	function imprimir_pdf(){

		$aFactura = $this->data["coorFactura"];
		$aBoxes = $this->explode_assoc_2("=",",", "&", $this->data["coorBoxes"]);
		
		$this->layout = 'pdf'; //this will use the pdf.thtml layout
    
    $this->set('aFactura',$aFactura);
		$this->set('aBoxes',$aBoxes);
	}
	
	function setearSubMenu(){
		$aSubMenu[0]['title'] = 'Facturar';
		$aSubMenu[0]['href']	 = PATH . 'facturas/listarClientesFacturar';
		$aSubMenu[0]['image']	 = PATH_IMAGE_SUBMENU . 'btn_facturar.png';

		$aSubMenu[1]['title'] = 'Cerrar Mes';
		$aSubMenu[1]['href']	 = PATH . 'facturas/listarClientesCerrarMes';
		$aSubMenu[1]['image']	 = '';
		
		$this->set('aSubMenu', $aSubMenu);
	
	}

	
	function explode_assoc($glue0, $glue1, $glue2, $array)
	{
		$array2=explode($glue2, $array);
		foreach($array2 as  $val)
		{
      $pos=strpos($val,$glue1);
      $key=substr($val,0,$pos);
			$array3[$key] =substr($val,$pos+1,strlen($val));
			
			$pos=strpos($val,$glue0);
			if($pos!=-1){
				//significa que tiene un subnivel mas
				$array4 = explode($glue0, $val);
				foreach($array4 as  $val2)
				{
					$pos2=strpos($val2,$glue1);
		      $key2=substr($val2,0,$pos2);
					$array4[$key2] =substr($val2,$pos2+1,strlen($val2));
				}
				$array3[$key] =$array4;
			}
			
		}
		return $array3;
	}
	
	function explode_assoc_2($glue0, $glue1, $glue2, $array)
	{
		$array2=explode($glue2, $array);
		foreach($array2 as  $val)
		{
      $pos=strpos($val,$glue1);
      $key=substr($val,0,$pos);
      $array4 = explode($glue0, $key);
			$key=$array4[1];
			$array3[$key] =substr($val,$pos+1,strlen($val));
		}
		return $array3;
	}
}	
?>